package com.huanmeiqi.lucene.demo;

import com.huanmeiqi.lucene.demo.ik.IKAnalyzer4Lucene7;
import com.huanmeiqi.lucene.demo.my.MyAttribute;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.junit.jupiter.api.Test;

import java.io.IOException;

/**
 * @author cq.Wang
 * @date 2018/8/9 10:17
 * @description
 */
public class AnalyzerTest {
    /**
     * （1）
     * org.apache.lucene.analysis.Analyzer 分析器，是分词器组件中的核心API，主要用于构建TokenStream(分词处理器)
     * <p>
     * public final TokenStream tokenStream(String fieldName, Reader reader)
     * public final TokenStream tokenStream(String fieldName, String text)
     * <p>
     * （2）TokenStreamComponents 分词处理器组件
     * TokenStreamComponents  createComponents(String fieldName)
     * 是Analyzer中唯一的抽象方法，扩展点。通过提供该方法的实现来实现自己的Analyzer，我们需要在createComponents方法中创建我们想要的分词处理器组件
     * fieldName，如果我们需要为不同的字段创建不同的分词处理器组件，则可根据这个参数来判断。否则，就用不到这个参数。
     */
    public void doToken(Analyzer analyzer, String content) throws IOException {
        TokenStream tokenStream = analyzer.tokenStream("content", content);
        tokenStream.reset();
        MyAttribute attribute = tokenStream.getAttribute(MyAttribute.class);
        while (tokenStream.incrementToken()) {
            System.out.print(attribute.toString() + " | ");
        }
        tokenStream.end();
        tokenStream.close();
    }

    /**
     *
     */

    @Test
    public void test01() throws IOException {
        String enStr = "The gas exchange teacher is really the most talented man in the world";
        String chStr = "换煤气老师真的是世界第一有才的男人";

        // [1]导入核心模块。Lucene提供的标准分词器
        doToken(new StandardAnalyzer(), chStr);
        System.out.println();

        // [2]导入lucene-analyzers-smartcn。Lucene提供的smart中文分词器
        doToken(new SmartChineseAnalyzer(), chStr);
        System.out.println();

        // [3]集成IK分词器之细粒度切分
        doToken(new IKAnalyzer4Lucene7(), chStr);
        System.out.println();

        // [4]集成IK分词器之智能切分。效果最佳
        // [5]给IK分词器添加字典和停止词。在source下添加IKAnalyzer.cfg.xml
        doToken(new IKAnalyzer4Lucene7(true), chStr);
        System.out.println();

    }

    /**
     * 自定义分词器
     * https://www.jianshu.com/p/914cb9b322dd
     */
    public void test02() {
        // 1、实现自己的MyAttribute、MyAttributeImpl

    }


}
